from sqlalchemy import (
    Column,
    Integer,
    Text,
    String,
    DateTime,
    ForeignKey,
    Table
    )

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    relationship,
    )

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()


class MyModel(Base):
    __tablename__ = 'models'
    id = Column(Integer, primary_key=True)
    name = Column(Text, unique=True)
    value = Column(Integer)

    def __init__(self, name, value):
        self.name = name
        self.value = value
        

class Usuario(Base):
    __tablename__ = 'usuario'
    idUsuario = Column("idUsuario", Integer, primary_key=True, nullable=False)
    login = Column("login", String(64), unique=True, nullable=False)
    password = Column("password", String(40), nullable=False)
    nombre = Column("nombre", String(64), nullable=False)
    #bg = deferred(Column("bg", LargeBinary, nullable=True )) #Column("bg", LargeBinary) 

    def __init__(self, login = '', password = '', nombre = '', apellido = '', telefono = '', direccion = '', bg = None, idUsuario = None):
        self.login = login
        self.password = password
        self.nombre = nombre
        self.idUsuario = idUsuario
        #self.bg = bg
        
    def __repr__(self):
        return '{id:%s, login:%s, nombre:%s, apellido:%s}' % (self.idUsuario, self.login, self.nombre, self.apellido)
    
    def toDict(self, proyecto = False, usuarios = False):
        return {'idUsuario':self.idUsuario , 'login': self.login, 'nombre': self.nombre, 'password': self.password}
       
class Tema(Base):
    __tablename__ = 'tema'
    idTema = Column("idtema", Integer, primary_key=True, nullable=False)
    idUsuario = Column('idUsuario',Integer, ForeignKey('usuario.idUsuario'), nullable=False)
    usuario = relationship("Usuario")
    nombre = Column("nombre", String(64), nullable=False)
    descripcion = Column("descripcion", String(64), nullable=False)
    noticias = relationship("Noticia", backref="tema") 
    #bg = deferred(Column("bg", LargeBinary, nullable=True )) #Column("bg", LargeBinary) 

    def __init__(self, idTema = None, nombre = '', descripcion = '', usuario = None, noticias = []):
        self.nombre = nombre
        self.descripcion = descripcion
        self.idTema = idTema
        self.usuario = usuario
        
    def toDict(self):
        return {'idTema':self.idTema , 'usuario': self.usuario.login , 'nombre': self.nombre , 'descripcion': self.descripcion}

class Noticia(Base):
    __tablename__ = 'noticia'
    idNoticia = Column("idNoticia", Integer, primary_key=True, nullable=False)
    idTema = Column('idTema',Integer, ForeignKey('tema.idtema'), nullable=False)
    titulo = Column("titulo", String(64), nullable=False)
    contenido = Column("contenido", String(512), nullable=False)
    fecha = Column("fecha", DateTime, nullable=False)
    #bg = deferred(Column("bg", LargeBinary, nullable=True )) #Column("bg", LargeBinary) 

    def __init__(self, idNoticia = None, idTema = None, tema= None, titulo = '', contenido = '', fecha = None):
        self.idNoticia = idNoticia
        self.idTema = idTema
        self.tema = tema
        self.titulo = titulo
        self.contenido = contenido
        self.fecha = fecha
        #self.bg = bg
        
    def toDict(self):
        return {'idNoticia': self.idNoticia , 'tema': self.tema.nombre, 'titulo':self.titulo , 'contenido': self.contenido, 'fecha': self.fecha.isoformat()}


subsc_tema = Table('subsc_tema', Base.metadata,
    Column('idSubscript', Integer, ForeignKey('subscript.idSubscript'), primary_key=True, nullable=False),
    Column('idTema', Integer, ForeignKey('tema.idtema'), primary_key=True, nullable=False)
)


class Subscriptor(Base):
    __tablename__ = 'subscript'
    idSubscript = Column("idSubscript", Integer, primary_key=True, nullable=False)
    temas = relationship("Tema", secondary=subsc_tema, backref="subscriptores")
    #bg = deferred(Column("bg", LargeBinary, nullable=True )) #Column("bg", LargeBinary) 

    def __init__(self, idSubscript = None, temas = []):
        self.idSubscript = idSubscript
        self.temas = temas
            
    def toDict(self, proyecto = False, usuarios = False):
        return {'idSubscript':self.idSubscript}
